package com.luyi.sensor.util;

import org.apache.ibatis.type.ArrayTypeHandler;
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
import org.apache.ibatis.type.MappedJdbcTypes;
import ru.yandex.clickhouse.ClickHouseArray;
import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

/**
 * Java Int 数组与 ClockHouse Array Int 转换器
 * 定义当前数据如何保存进数据库中
 * @version 1.0
 * @since 2019/11/14 9:59
 */
@MappedJdbcTypes(JdbcType.ARRAY)
public class ClickArrayToStringHandler extends BaseTypeHandler<String[]> {
//public class ClickArrayToStringHandler extends ArrayTypeHandler<String[]> {

  private static final String DEFAULT_CHARSET = "UTF-8";

    /**
     * 一个set，表示向PreparedStatement里面设置值。
     * @param preparedStatement //setParameter方法，是使用typeHandler通过PreparedStatement对象进行设置SQL参数的时候使用的具体方法
     * @param i                 //其中i是参数在SQL的下标, parameter是参数
     * @param Strings           //Int数组
   * @param jdbcType            //jdbcType是数据库类型
   * @throws SQLException
   */
  @Override
  public void setNonNullParameter(PreparedStatement preparedStatement, int i, String[] Strings, JdbcType jdbcType)
          throws SQLException {
    preparedStatement.setObject(i, Strings);
  }

  /*三个getxxx方法*/
  /**
   * 一个是根据列名获取值
   * @param resultSet 返回结果集
   * @param s
   * @return
   * @throws SQLException
   */
  @Override
  public String[] getNullableResult(ResultSet resultSet, String s) throws SQLException {
    Object obj = resultSet.getObject(s); //获取此ResultSet对象当前行中指定列的值作为 Java 编程语言中的Object 。
    return parseClickHouseArrayToString(obj);
  }

  /**
   * 一个是根据列索引位置获取值
   * @param resultSet
   * @param i
   * @return
   * @throws SQLException
   */
  @Override
  public String[] getNullableResult(ResultSet resultSet, int i) throws SQLException {
    Object obj = resultSet.getObject(i);
    return parseClickHouseArrayToString(obj); //
  }

  //存储过程
  @Override
  public String[] getNullableResult(CallableStatement callableStatement, int i) throws SQLException {
    Object obj = callableStatement.getObject(i);
    return parseClickHouseArrayToString(obj);
  }

  /**
   * clickhouse的Array变为String数组类型
   * @param obj 传入的clickhouse--Array
   * @return
   */
  private String[] parseClickHouseArrayToString(Object obj) {
    if (obj instanceof ClickHouseArray) {
      String[] res = new String[0];//创建空字符串数组
      try {
        res = (String[]) ((ClickHouseArray) obj).getArray();//将ClickHouseArray转化成String[]的结果
      } catch (SQLException ex) {
        ex.printStackTrace();
      }

      if (res != null && res.length > 0) {//转化结果不为空且有值
        String[] resI = new String[res.length];//创建同等长度的String数组

        for (int i = 0; i < res.length; i++) {
          resI[i] = res[i]; //进行复刻
        }
        return resI;
      }
    }
    return new String[0];//返回字符串的数组
  }
}
